package com.gr.controller;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.gr.entity.Jar;
import com.gr.service.JarService;
import com.gr.service.impl.JarServiceImpl;
import com.sun.deploy.net.HttpResponse;
import org.apache.commons.io.FileUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.List;
import java.util.UUID;

@Controller

public class JarController {
    private JarService js=new JarServiceImpl();
    /*@RequestMapping("/selectAll")
    public String selectAll(Model model){//放入request需要用到Model
        List<Jar> jars = js.selectAll();
        jars.forEach(System.out::println);
        model.addAttribute("jars",jars);
        return "/showlist.jsp";
    }*/
    @RequestMapping("/selectAll")
    public ModelAndView selectAll(Model model){//放入request需要用到Model
        List<Jar> jars = js.selectAll();
        ModelAndView mv=new ModelAndView();
        mv.addObject("jars",jars);
        mv.setViewName("/showlist.jsp");


        return mv;
    }
    @RequestMapping("/upload")
    /**
     * jar是文件 jar1是对象
     * 上传文件要用MultipartFile，参数名要与jsp中的
     * jar包<input type="file" name="jar"/><br/>     name值一致
     * 接收description，两种方式：
     * 1.直接传入String description，但这样还要把description包装成jar对象
     * 调dao时是传入jar对象而不是一个字符串
     * 2.直接传入Jar jar里面有description 打点调用
     * 方法中要做：1.把jar包上传到指定文件夹(文件上传)    把数据绑定到数据库表中(保存数据到数据库)
     */
    public String upload(MultipartFile jar,Jar jar1) throws IOException {//传入文件对象叫jar，为了收参可以直接.属性获取描述
        InputStream inputStream = jar.getInputStream();//excel的文件输入流
        /**1.newFileName    解决文件名重复上传问题
         * 2.getOriginalFilename    解决后缀问题
         * 3.return "redirect:/uploadPhone.jsp";    转发修改为重定向，解决刷新让重复添加的问题
         * 上传到服务器改名字，后期如何知道哪个图片对应手机？
         * 解决：手机表除了存手机名字、价格等基本信息，还要存入图片图片名，后期根据id查出手机基本信息想看图片再到该文件夹找到该图片
         * 图片信息和基础数据信息分开放
         * 这样的上传无法让其它电脑共享，要edit tomcat 将文件加入项目
         */
        //目前jar对象只有描述属性，需要对其他的属性进行获取 ↓
        //获取到用户上传时使用的文件名    文件放入服务器中，对象放入数据库
        jar1.setSize(jar.getSize());//调用MultipartFile类的getSize方法，获取文件大小
        jar1.setName(jar.getOriginalFilename());//获取老文件名，就是jar的name属性
        //uuid+jar.getOriginalFilename获取老的文件名
        String FileName=UUID.randomUUID().toString()+jar.getOriginalFilename();//存储文件名，就是加了uuid后的新文件名
        jar1.setFileName(FileName);//添加时描述已经有了，收参时收的jar对象，属性和其中一个参数name一样 默认是参数传入
//        String newFileName = UUID.randomUUID().toString()+jar.getOriginalFilename();上面以获取
        File file=new File("f:/testImg/"+FileName);//完整存储路径(目标文件夹，一定要记得文件夹后面/，后面跟新文件名)
        jar.transferTo(file);
        //调service层添加对象方法 加入mysql中
        js.addJar(jar1);//完成操作
        return "redirect:/selectAll.do";//添加成功重定向至查询所有
    }
    @RequestMapping("downloadJAR")//需要重定向，需要response
    public void download(String name,String fileName, HttpServletResponse resp) throws Exception {
        //1.通过文件名转换为文件
        File sourceFile=new File("f:/testImg/"+fileName);//数据源，在文件夹里存的名字
        //2.设置响应格式和文件的名字
//        resp.setHeader("content-disposition","attachment;fileName="+name);
        /**
         * 设置请求头
         */
        resp.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode(name,"utf-8"));//name下载到本地的名字
        //3.把文件放入到response里面。
        FileUtils.copyFile(sourceFile,resp.getOutputStream());
    }
    /**
     * 导出功能与下载相同，所以返回值void
     */
    @RequestMapping("/exportExcel")//参数为HttPServletResponse,不然只能调用getInPutStream()
    public void exportExcel(HttpServletResponse response)throws Exception{//也需要response
        //导出：先查询所有数据
        List<Jar> jars=js.selectAll();
        ExportParams params=new ExportParams("所有的jar包数据","jars");//Excel基本信息
        Workbook workbook= ExcelExportUtil.exportExcel(params,Jar.class,jars);
        //2.设置响应格式和文件的名字
        response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode("导出的jar包信息.xlsx","utf-8"));//name下载到本地的名字
        /**
         * 笨方法：先写到一个盘，在下面再读入输出流中
         * 在这write直接写入response输出流中更简单
         读文件的流File就不需要了
         */
        workbook.write(response.getOutputStream());//此方法把文件写入输出流中，response就是输出流
//        FileUtils.copyFile(sourceFile,response.getOutputStream());被上一行替代
    }
    @RequestMapping("/addBatch")
    public String addBatch(MultipartFile excel) throws Exception {
        InputStream inputStream =excel.getInputStream();
        /**
         * 导入参数对象
         * setTitleRows 声明标题占有的行数
         * setHeadRows 声明表头占有的行数
         */
        ImportParams importParams = new ImportParams();
        importParams.setTitleRows(1);//标题
        importParams.setHeadRows(1);//表头
        /**
         * 导入方法
         * 参数1 流
         * 参数2 类对象
         * 参数3 导入参数对象
         */
        List<Jar> jars = ExcelImportUtil.importExcel(inputStream, Jar.class, importParams);
        for (Jar jar : jars) {
            js.addJar(jar);
        }
        return "redirect:/selectAll.do";
    }

}
